#include <STC15F2K60S2.H>
#include "intrins.h"
#define DELAY_TIME	5
//总线引脚定义
sbit sda = P2^1;  /* 数据线 */
sbit scl = P2^0;  /* 时钟线 */
//
static void I2C_Delay(unsigned char n)
{
    do
    {
		_nop_();
//		_nop_();_nop_();_nop_();_nop_();
//        _nop_();_nop_();_nop_();_nop_();_nop_();
//        _nop_();_nop_();_nop_();_nop_();_nop_();
//        _nop_();_nop_();_nop_();_nop_();_nop_();		
	}
    while(n--);      	
}
void operate_Delay(unsigned char t)
{
	unsigned char i;
	
	while(t--){
		for(i=0; i<112; i++);
	}
}
//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
} 

void EEPROM_Write(unsigned char* pucBuf, unsigned char addr, unsigned char num){
	I2CStart(); 
	 I2CSendByte(0xa0); 
	 I2CWaitAck(); 
	 I2CSendByte(addr); 
	 I2CWaitAck(); 
	 while(num--) 
	 { 
		 I2CSendByte(*pucBuf++); //一个地址存一个字节，存一个地址一个一个往后移来存
		 I2CWaitAck(); 
		 I2C_Delay(200); 
	 } 
	 I2CStop(); 
	 operate_Delay(20);//写周期要延时，是因为I2C只是把数据传到EEPROM,EEPROM存储还需要时间
 }
void EEPROM_Read(unsigned char* pucBuf, unsigned char addr, unsigned char num){
	I2CStart();
	 I2CSendByte(0xa0); 
	 I2CWaitAck(); 
	 I2CSendByte(addr); 
	 I2CWaitAck(); 
	 I2CStart(); 
	 I2CSendByte(0xa1); 
	 I2CWaitAck(); 
	 while(num--) 
	 { 
		 *pucBuf++ = I2CReceiveByte(); //一个地址存一个字节，存一个地址一个一个往后移来存
		 if(num) I2CSendAck(0); 
		 else I2CSendAck(1); 
	 } 
	 I2CStop(); 
}